package top.broncho.lottery.di

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import dagger.Binds
import dagger.Module
import dagger.multibindings.IntoMap
import top.broncho.lottery.di.annotation.ViewModelKey
import top.broncho.lottery.ui.history.HistoryViewModule
import top.broncho.lottery.ui.main.MainViewModule
import top.broncho.lottery.ui.ocr.OcrViewModule

@Module
abstract class ViewModelModule {

    // @Binds 类似于 @Provides，在使用接口声明时使用，区别是 @Binds 用于修饰抽象类中的抽象方法的
    // 这个方法必须返回接口或抽象类，比如 ViewModel，不能直接返回 MainViewModule
    // 方法的参数就是这个方法返回的是注入的对象，类似@Provides修饰的方法返回的对象
    // 这里的 MainViewModule 会通过上述声明的构造器注入自动构建
    @Binds
    @IntoMap
    //@MapKey的封装注解
    @ViewModelKey(MainViewModule::class)
    abstract fun bindMainViewModel(mainViewModel: MainViewModule): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(OcrViewModule::class)
    abstract fun bindOcrViewModel(ocrViewModule: OcrViewModule): ViewModel

    @Binds
    @IntoMap
    @ViewModelKey(HistoryViewModule::class)
    abstract fun bindHistoryViewModel(historyViewModule: HistoryViewModule): ViewModel

    @Binds
    abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory
}